package org.jboss.seam.wiki.core.dao; import javax.persistence.EntityManager; import javax.persistence.EntityNotFoundException; import javax.persistence.NoResultException; import javax.persistence.Query; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.AutoCreate; import org.jboss.seam.wiki.core.model.User; import org.jboss.seam.Component; import org.hibernate.criterion.Order; import org.hibernate.criterion.Example; import org.hibernate.criterion.MatchMode; import org.hibernate.Session; import org.hibernate.Criteria; import org.hibernate.ScrollableResults; import org.hibernate.transform.DistinctRootEntityResultTransformer; import java.util.List; import java.util.ArrayList; import java.util.Collection; @Name("userDAO") @AutoCreate public class UserDAO { @In protected EntityManager entityManager; public User findUser(Long userId) { return entityManager.find(User.class, userId); } public User findUser(String username, boolean onlyActivated, boolean caseSensitive) { StringBuilder query = new StringBuilder("select u from User u where"); if (caseSensitive) query.append(" u.username = :username"); else query.append(" lower(u.username) = :username"); if (onlyActivated) query.append(" and u.activated = true"); try { return (User) entityManager .createQuery(query.toString()) .setParameter("username", caseSensitive ? username : username.toLowerCase()) .getSingleResult(); } catch (EntityNotFoundException ex) { } catch (NoResultException ex) { } return null; } public long findTotalNoOfUsers() { Query q = entityManager.createQuery("select count(u) from User u"); q.setHint("org.hibernate.comment", "Find number of users"); q.setHint("org.hibernate.cacheable", true); return (Long)q.getSingleResult(); } public List<User> findUsersWithUsername(Collection<String> usernames) { // We need to batch this because we use an in() expression int batchsize = 50; int i = 0; List<String> usernamesToQuery = new ArrayList<String>(batchsize); List<User> users = new ArrayList<User>(); for (String username : usernames) { usernamesToQuery.add(username); i++; if (i % batchsize == 0 || usernames.size() < batchsize) { // Query and clear Query q = entityManager.createQuery("select u from User u left join fetch u.profile where u.username in(:usernames)"); q.setParameter("usernames", usernamesToQuery); users.addAll(q.getResultList()); usernamesToQuery.clear(); } } return users; } public User findUserWithActivationCode(String activationCode) { StringBuilder query = new StringBuilder("select u from User u where u.activationCode = :activationCode"); try { return (User) entityManager .createQuery(query.toString()) .setParameter("activationCode", activationCode) .getSingleResult(); } catch (EntityNotFoundException ex) { } catch (NoResultException ex) { } return null; } public long findRatingPoints(Long userId) { Object ratingPoints = entityManager .createQuery("select sum(n.rating) from WikiNode n where n.createdBy.id = :userId") .setParameter("userId", userId) .getSingleResult(); return ratingPoints != null ? (Long)ratingPoints : 0; } public Long countNodesCreatedBy(Long userId) { return (Long)entityManager.createQuery("select count(n) from WikiNode n where n.createdBy.id = :userId") .setParameter("userId", userId) .getSingleResult(); } public void resetNodeCreatorToAdmin(User user) { User adminUser = (User) Component.getInstance("adminUser"); entityManager.createQuery("update WikiNode n set n.createdBy = :admin where n.createdBy = :user") .setParameter("admin", entityManager.merge(adminUser)) .setParameter("user", user) .executeUpdate(); entityManager.createQuery("update WikiNode n set n.lastModifiedBy = :admin where n.lastModifiedBy = :user") .setParameter("admin", entityManager.merge(adminUser)) .setParameter("user", user) .executeUpdate(); } public List<User> findByExample(User exampleUser, String orderByProperty, boolean orderDescending, int firstResult, int maxResults, String... ignoreProperty) { Criteria crit = prepareExampleCriteria(exampleUser, orderByProperty, orderDescending, ignoreProperty); crit.setFirstResult(firstResult).setMaxResults(maxResults); return (List<User>)crit.list(); } public int getRowCountByExample(User exampleUser, String... ignoreProperty) { Criteria crit = prepareExampleCriteria(exampleUser, null, false, ignoreProperty); ScrollableResults cursor = crit.scroll(); cursor.last(); int count = cursor.getRowNumber() + 1; cursor.close(); return count; } private Criteria prepareExampleCriteria(User exampleUser, String orderByProperty, boolean orderDescending, String... ignoreProperty) { Example example = Example.create(exampleUser).enableLike(MatchMode.ANYWHERE).ignoreCase(); // Sanitize input if (orderByProperty != null) { orderByProperty = orderByProperty.replaceAll("[^a-zA-Z0-9]", ""); } for (String s : ignoreProperty) example.excludeProperty(s); Session session = (Session)entityManager.getDelegate(); Criteria crit = session.createCriteria(User.class).add(example); if (orderByProperty != null) crit.addOrder( orderDescending ? Order.desc(orderByProperty) : Order.asc(orderByProperty) ); return crit.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); } }